Pythonのリストは下位層で緩いリンクリストではなく、高度に組織化された ArrayList。その核心的な真実とは、メモリ上では連続したアドレス空間を占有しているということです。ここに格納されているのはオブジェクト自体ではなく、オブジェクトへの 参照(在 C 语言层面即为指针)。这种设计实现了异构数据的统一管理,无论是三原色(RGB)元组还是复杂的加密密钥 (Key),都只需占据一个固定大小的指针位。
アドレス指定の数学とパフォーマンスのトレードオフ
- $O(1)$ のランダムアクセス:公式 $\text{要素アドレス} = \text{開始アドレス} + \text{インデックス} \times \text{サイズ}$ を使って、CPUは瞬時に位置を特定できます。
- 平均分析(アモアライズド・アナリシス):過剰割り当て戦略を利用することで、単回の挿入が $O(n)$ になる可能性はありますが、$\text{総コスト} = n + \sum_{j=0}^{\lg n} 2^j = 3n$ となり、平均 $O(1)$ の追加パフォーマンスが保証されます。
- 挿入の制限:図8-2のように、任意の位置での`insert`操作では、後続のすべてのポインタをシフトしなければならず、計算量は $O(n)$ になります。
アルゴリズムの比較
ArrayListのインデックス($O(1)$)とは異なり、スプリットリスト(Skip List)の検索操作の時間計算量は $O(\log n)$ です。また、RSAアルゴリズムの基礎であるユークリッドアルゴリズムの核となるのは $gcd(a,0)=a$ です。これらのアルゴリズムは、メモリの狭い領域内で動作しています。